﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Viettel.VOFFICE.DAO.Models;

namespace Viettel.VOFFICE.DAO.DAL.Repository
{
    /// <summary>
    /// lữu trữ phân loại công văn
    /// loại công văn là yếu tố quan trọng dùng để quyết định luồng và một số yếu tố khác
    /// </summary>
    public class DocumentTypeRepository : IRepository<DocumentType>
    {
        private VOFFICEContext context;
        public DocumentTypeRepository(VOFFICEContext context)
        {
            if (context == null)
            {
                throw new Exception("Context must be init");
            }
            this.context = context;
        }
        /// <summary>
        /// Lấy toàn bộ loại hồ sơ
        /// </summary>
        /// <returns></returns>
        public IEnumerable<DocumentType> Get()
        {
            return context.DocumentTypes.OrderByDescending(o => o.UpdatedAt).Select(o => o);
        }

        /// <summary>
        /// Lấy một loại hồ sơ từ danh sách
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public DocumentType GetById(object id)
        {
            return context.DocumentTypes.Find(int.Parse(id.ToString()));
        }

        public IEnumerable<DocumentType> FindByName(object s)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Thêm loại văn bản mới
        /// </summary>
        /// <param name="T"></param>
        public void Insert(DocumentType T)
        {
            if (null != T)
            {
                context.DocumentTypes.Add(T);
                Save();
            }
        }

        /// <summary>
        /// Xóa loại văn bản
        /// </summary>
        /// <param name="id">Id của loại văn bản đó</param>
        public void Delete(object id)
        {
            var item = GetById(id);
            if (null != item)
            {
                context.DocumentTypes.Attach(item);
                context.DocumentTypes.Remove(item);
                Save();
            }
        }

        /// <summary>
        /// Xóa loại văn bản
        /// </summary>
        /// <param name="T">Entity loại văn bản</param>
        public void Delete(DocumentType T)
        {
            if (null != T)
            {
                context.DocumentTypes.Attach(T);
                context.DocumentTypes.Remove(T);
                Save();
            }
        }

        /// <summary>
        /// Cập nhập loại văn bản
        /// </summary>
        /// <param name="T">Entity loại văn bản cần cập nhập</param>
        public void Update(DocumentType T)
        {
            context.Entry(T).State = EntityState.Modified;
            Save();
        }

        public void Save()
        {
            context.SaveChanges();
        }

        /// <summary>
        /// Lấy tất cả loại công văn với giá trị isActive truyền vào
        /// </summary>
        /// <param name="isActive"></param>
        /// <returns></returns>
        public IEnumerable<DocumentType> GetAllActive(bool isActive = true)
        {
            if (isActive == true)
            {
                return context.DocumentTypes.Where(o => o.IsActive == true).OrderByDescending(o => o.UpdatedAt).Select(o => o);
            }
            else
            {
                return context.DocumentTypes.Where(o => o.IsActive == null || o.IsActive == false).OrderByDescending(o => o.UpdatedAt).Select(o => o);
            }
        }

        /// <summary>
        /// Lấy toàn bộ loại văn bản theo sổ văn bản
        /// </summary>
        /// <param name="bookId"></param>
        /// <param name="isActive"></param>
        /// <returns></returns>
        public IEnumerable<DocumentType> GetByBook(int bookId, bool isActive = true)
        {
            return context.DocumentTypes.Where(o => (o.BookId == bookId || o.IsCommon == true) && o.IsActive == isActive);
        }
    }
}
